package com.atguigu.stuty.utils;

import java.util.concurrent.CountDownLatch;

/**
 * @Author early morning
 * @Create 2025/4/23 22:06
 * @Description: CountDownLatch 多个线程执行完成，最后一个线程再执行，做减法
 *
 *  让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒。
 *  CountDownLatch主要有两个方法，当一个或多个线程调用await方法时，这些线程会阻塞。
 *  其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞)，
 *  当计数器的值变为0时，因await方法阻塞的线程会被唤醒，继续执行。
 *  解释：6个同学陆续离开教室后值班同学才可以关门。
 *  main主线程必须要等前面6个线程完成全部工作后，自己才能开干
 */
public class CountDownLatchTest {
    public static void main(String[] args) throws InterruptedException {

        int num = 6;
        // 主线程需要等待 6 个子线程完成，才能执行
        CountDownLatch countDownLatch = new CountDownLatch(num);

        for (int i = 1; i <= num; i++) {
            new Thread(() -> {
                // Runnable 接口的实现类
                // 减少计数器的值（减 1）
                System.out.println(Thread.currentThread().getName()+ "\t" + "子线程执行完成");
                countDownLatch.countDown();
            },String.valueOf(i)).start();
        }

        countDownLatch.await();
        System.out.println(Thread.currentThread().getName()+ "\t" + "主先成功执行完成了");
    }
}
